const mysql = require('mysql')
const { MYSQL_CONF } = require('../../server_config.json')
const logger = require('../libs/log').logger;

// 用于保存数据连接实例
var db = null;
var pingInterval;

// 如果数据连接出错，则重新连接
function handleError(err) {
  logger.info(err.stack || err);
  connect();
}

// 建立数据库连接
function connect() {
  if (db !== null) {
    db.destroy();
    db = null;
  }

  db = mysql.createConnection(MYSQL_CONF);
  db.connect(function (err) {
    if (err) {
      logger.info("error when connecting to db,reConnecting after 2 seconds:", err);
      setTimeout(connect, 2000);
    }
  });
  db.on("error", handleError);

  // 每个小时ping一次数据库，保持数据库连接状态
  clearInterval(pingInterval);
  pingInterval = setInterval(() => {
    console.log('ping...');
    db.ping((err) => {
      if (err) {
        console.log('ping error: ' + JSON.stringify(err));
      }
    });
  }, 1800000);
}
connect();

// 统一执行sql的函数
// 可能会疑惑这里没有数据库的关闭操作，是不是不安全，因为我们这里是通过promise操作的，如果这里我们关闭了数据库，后面就无法获取数据，会报错
function exec(sql, sqlParams) {
  const promise = new Promise((resolve, reject) => {
    db.query(sql, sqlParams, (err, result) => {
      if (err) return reject(err)
      return resolve(result)
    })
  })
  return promise
}


module.exports = {
  exec
}